package com.project.server;

import com.project.service.*;
import com.project.util.ServiceFactory;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;



/**
 * 处理socket线程类
 */
public class SocketThread implements  Runnable{
   private static String header = "HTTP/1.1 200 OK\r\n" +
            "Content-Type: text/html;charSet=utf-8\r\n" +
            "\r\n";
    private Socket socket;

    public SocketThread (Socket socket ) {
        this.socket= socket;
//        启动线程
        new Thread(this).start();
    }
    @Override
    public void run() {
        try {

            //         从socket中得到读取流，用于读取客户的读取信息
            InputStream in = socket.getInputStream();
            //            从socket中得到写入流，用于写入客户的读取信息。
            OutputStream out = socket.getOutputStream();
//            将写入流封装成Response对象，以便更好的向客户端发送信息
            Response resp = new Response(out);
//            将读取流封装成Request对象，以便更好的读取数据。
            Request req = new Request(in);
            System.out.println(req);
//            得到客户端的路径
             String url = req.getUrl();
//            发送到客服端
            out.write(header.getBytes());
//            用工厂模式来得到servlet对象
            Servlet servlet = ServiceFactory.getServlet(url);
         if (servlet!=null){//不等于空就返回业务请求的组件
             servlet.service(req,resp);
         }
            else {//请求的文件
                resp.sendFile(url);
            }
               out.flush();
//            关闭流
            out.close();
            in.close();
            this.socket.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
//        try {
////            从socket中读取流，用于读取客户的信息
//            InputStream in = socket.getInputStream();
////            从socket中得到写入流，用于写入用户读取的信息
//            OutputStream out = socket.getOutputStream();
////            将写入流封装成一个response对象，以便更好的向客户端发送信息
//            Response reps = new Response(out);
////            将读取流封装成一个request对象,以便更好的读取信息。
//            Request req = new Request(in);
////            得到客户的数据
//            String url = req.getUrl();
////            发送到客服端
//            out.write(header.getBytes());
//            reps.sendFile(url);
//
////            关闭流
//            out.close();
//            in.close();
//            this.socket.close();
//
//        } catch (IOException e) {
//            e.printStackTrace();
//        }

    }
}
